<script setup>

import Dialog from "@/components/dialog/Dialog.vue";
import {inject, nextTick, onMounted, ref, watch} from "vue";

const props = defineProps({
    sentenceConfigDialog: {
        type: Object,
        default: () => {
            return {
                data: {
                    wordVectorDimension: null,
                    qaWordVectorDimension: null,
                    tf: {
                        use: true,
                        maxLength: null,
                        multiNumber: null,
                        outAllPro: null,
                        norm: null,
                        startWord: null,
                        endWord: null,
                        featureDimension: null,
                        allDepth: null,
                        studyRate: null,
                        typeNumber: null,
                        times: null,
                    }
                }
            }
        }
    },
    fineTune: {
        type: Boolean,
        default: false
    },
    type: {
        type: String,
        default: () => {
            return 'classification'
        }
    }
})
const message = inject('message')
const activeName = ref("wordEmbedding")

onMounted(() => {
    if(props.type === 'qa'){
        activeName.value = "long"
    }else {
        activeName.value = "wordEmbedding"
    }
})

const options = [
    {
        value: 0,
        label: '无正则模式'
    },
    {
        value: 1,
        label: 'L1正则模式'
    },
    {
        value: 2,
        label: 'L2正则模式'
    }
]

const emits = defineEmits([
    'onTraining',// 页数改变事件
])

const onTraining = () => {
    if(!props.sentenceConfigDialog.data.remark){
        message.warning("输入模型名称")
        return
    }
    emits('onTraining')
}

watch(() => props.sentenceConfigDialog.data.wordVectorDimension, (newValue, oldValue) => {
    props.sentenceConfigDialog.data.qaWordVectorDimension = newValue
    props.sentenceConfigDialog.data.tf.featureDimension = newValue
})

</script>

<template>
    <Dialog :dialog="sentenceConfigDialog">
        <el-form :model="sentenceConfigDialog.data" label-width="auto" :label-position="'top'">
            <el-tabs v-model="activeName">
                <el-tab-pane v-if="type !== 'qa'" label="词向量设置" name="wordEmbedding">
                    <el-form-item label="是否打印日志">
                        <el-switch v-model="sentenceConfigDialog.data.showLog" style="width: 100%;" />
                    </el-form-item>
                    <el-form-item label="语义分类词向量维度(长语句要设置为偶数)">
                        <el-input-number style="width: 100%" :disabled="fineTune"
                                         v-model="sentenceConfigDialog.data.wordVectorDimension" />
                        <el-text>
                            该词向量维度越大，则对越复杂的语义及语句结构表达性越好，但运算速度也越慢。
                        </el-text>
                    </el-form-item>
                    <el-form-item label="用户输入语句最大长度">
                        <el-input-number style="width: 100%" :disabled="fineTune"
                                         v-model="sentenceConfigDialog.data.maxWordLength" />
                        <el-text>
                            若输入语句超过该长度，超出部分将被忽略。
                        </el-text>
                    </el-form-item>
                    <el-form-item label="小于该参数的输入语句长度，训练时不进行跳层">
                        <el-input-number style="width: 100%" :disabled="fineTune"
                                         v-model="sentenceConfigDialog.data.minLength" />
                    </el-form-item>
                    <el-form-item label="语义分类可信阈值">
                        <el-input-number style="width: 100%" :disabled="fineTune"
                                         v-model="sentenceConfigDialog.data.trustPowerTh" :step="0.1" :max="1" :min="0" step-strictly />
                    </el-form-item>
                    <el-form-item label="关键词敏感性嗅探颗粒度">
                        <el-input-number style="width: 100%" :disabled="fineTune"
                                         v-model="sentenceConfigDialog.data.keyWordNerveDeep" />
                        <el-text>
                            越大适合越长的句子,越小适合越小的句子
                        </el-text>
                    </el-form-item>
                    <el-form-item label="训练增强次数" v-if="sentenceConfigDialog.data.tag !== 'qa'">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.times" />
                        <el-text>
                            同时增加词向量训练循环次数，最终循环次数 = 训练增强次数 * 用户输入语句最大长度(默认20) * 最长回答长度(默认20)
                        </el-text>
                    </el-form-item>
                    <el-form-item label="词向量学习率(越小越准)">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.weStudyPoint" />
                    </el-form-item>
                    <el-form-item label="词向量正则系数">
                        <el-input-number style="width: 100%" :disabled="fineTune"
                                         v-model="sentenceConfigDialog.data.weLParam" />
                    </el-form-item>
                    <el-form-item label="正则模式" >
                        <el-select v-model="sentenceConfigDialog.data.rzModel" :disabled="fineTune">
                            <el-option
                                v-for="item in options"
                                :key="item.value"
                                :label="item.label"
                                :value="item.value"
                            />
                        </el-select>
                        <el-text v-show="sentenceConfigDialog.data.rzModel === 0">
                            无正则模式即不对权重施加惩罚，或者样本数据量较为大充足时，样本规律性较强，可直接使用无正则模式
                        </el-text>
                        <el-text v-show="sentenceConfigDialog.data.rzModel === 1">
                            L1正则模式，当出现异常值，或者未见过的异常噪音时，L1的鲁棒性非常强。它是以简化模型，突出重点权重的方式来增强其稳定性与鲁棒性的
                        </el-text>
                        <el-text v-show="sentenceConfigDialog.data.rzModel === 2">
                            L2正则模式，它更容易调动全部参数特征，让特征平均的落在每个权重上，误差最容易最快下降到最优解的位置上。面对形态多变且种类复杂，或者维度比较大的情况下，能获得最好的优化效果
                        </el-text>
                    </el-form-item>
                </el-tab-pane>

                <el-tab-pane v-if="type === 'qa'" label="QA设置" name="long">
                    <el-form-item label="是否打印日志">
                        <el-switch v-model="sentenceConfigDialog.data.tf.showLog" style="width: 100%;" />
                    </el-form-item>
                    <el-form-item label="最大时序长度">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.tf.maxLength" />
                        <el-text>
                            能记忆的字符长度，越大对话越准确，但会显著增加内存占用和计算量
                        </el-text>
                    </el-form-item>
                    <el-form-item label="多头数量">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.tf.multiNumber" />
                        <el-text>
                            模型可以从多个不同的表示子空间中捕捉文本特征，多头数量越大，模型训练和推理所需的计算资源就越多。
                        </el-text>
                    </el-form-item>
                    <el-form-item label="输出全概率">
                        <el-switch v-model="sentenceConfigDialog.data.tf.outAllPro" style="width: 100%;" />
                        <el-text>
                            若输出全概率只能用来分类概率,否则将消耗大量内存
                        </el-text>
                    </el-form-item>
                    <el-form-item label="是否生成模式">
                        <el-switch v-model="sentenceConfigDialog.data.tf.norm"  style="width: 100%;"/>
                        <el-text>
                            当不是生成模式的时候，则使用自定义分类模式，typeNumber会生效，反之则不会
                        </el-text>
                    </el-form-item>
                    <el-form-item label="开始符">
                        <el-input style="width: 100%"
                                         v-model="sentenceConfigDialog.data.tf.startWord" />
                    </el-form-item>
                    <el-form-item label="结束符">
                        <el-input style="width: 100%"
                                         v-model="sentenceConfigDialog.data.tf.endWord" />
                    </el-form-item>
                    <!-- 自然语言的长语句设置中的 特征维度 使用的是 问答词向量维度 -->
                    <el-form-item label="词向量特征维度">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.tf.featureDimension" />
                    </el-form-item>
                    <el-form-item label="编解码层深度">
                        <el-input-number style="width: 100%" :min="1"
                                         v-model="sentenceConfigDialog.data.tf.allDepth" />
                    </el-form-item>
                    <el-form-item label="学习率(越小越准)">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.tf.studyRate" />
                        <el-text>
                            可以使用默认值0.004或者自定义
                        </el-text>
                    </el-form-item>
                    <el-form-item label="线性层softMax分类数量">
                        <el-input-number style="width: 100%" :disabled="fineTune"
                                         v-model="sentenceConfigDialog.data.tf.typeNumber" />
                    </el-form-item>
                    <el-form-item label="训练循环次数">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.tf.times" />
                    </el-form-item>
                    <el-form-item label="多线程并行数量">
                        <el-input-number style="width: 100%"
                                         v-model="sentenceConfigDialog.data.tf.coreNumber" />
                        <el-text>
                            超过128时，才值得开启并行运算进行加速。若小于该数值，则并行运算效率反而会低于单进程运算！
                        </el-text>
                    </el-form-item>
                    <el-form-item label="词粒度间隔符">
                        <el-input v-model="sentenceConfigDialog.data.tf.splitWord" />
                        <el-text>
                            默认为空，即不进行分词，若输入为空格，则表示按照空格进行分词，若输入为逗号，则表示按照逗号进行分词，以此类推。
                        </el-text>
                    </el-form-item>
                    <el-form-item label="时间序列惩罚系数">
                        <el-input-number style="width: 100%" :min="0" :max="1"
                                         v-model="sentenceConfigDialog.data.tf.timePunValue" :disabled="fineTune" />
                        <el-text>
                            该参数越大则距离越远的时间序列的特征，对当前序列的特征影响就越大，越近的特征就会变的越小。该参数越小则受远距离的时间序列特征影响就越小，越近的特征影响则越大
                        </el-text>
                    </el-form-item>
                    <el-form-item label="正则系数">
                        <el-input-number style="width: 100%" :min="0" :max="1" :disabled="fineTune"
                                         v-model="sentenceConfigDialog.data.tf.regular" />
                        <el-text>
                            取值范围是[0,1),当取值为0时即为无正则影响,调整到合适的正则系数有助于抵抗过拟合，增强网络的鲁棒性与稳定性，
                            该值越大则对神经元权重惩罚越强，推荐默认值是0.01
                        </el-text>
                    </el-form-item>
                    <el-form-item label="正则模式">
                        <el-select v-model="sentenceConfigDialog.data.tf.regularModel" :disabled="fineTune">
                            <el-option
                                v-for="item in options"
                                :key="item.value"
                                :label="item.label"
                                :value="item.value"
                            />
                        </el-select>
                        <el-text v-show="sentenceConfigDialog.data.rzModel === 0">
                            无正则模式即不对权重施加惩罚，或者样本数据量较为大充足时，样本规律性较强，可直接使用无正则模式
                        </el-text>
                        <el-text v-show="sentenceConfigDialog.data.rzModel === 1">
                            L1正则模式，当出现异常值，或者未见过的异常噪音时，L1的鲁棒性非常强。它是以简化模型，突出重点权重的方式来增强其稳定性与鲁棒性的
                        </el-text>
                        <el-text v-show="sentenceConfigDialog.data.rzModel === 2">
                            L2正则模式，它更容易调动全部参数特征，让特征平均的落在每个权重上，误差最容易最快下降到最优解的位置上。面对形态多变且种类复杂，或者维度比较大的情况下，能获得最好的优化效果
                        </el-text>
                    </el-form-item>
                </el-tab-pane>
            </el-tabs>

        </el-form>
        <template #table-dialog-btn>
            <el-input v-model="sentenceConfigDialog.data.remark" style="width: 200px;margin-right: 10px" :disabled="fineTune" placeholder="模型名称" />
            <el-button type="primary" @click="onTraining">训练</el-button>
        </template>
    </Dialog>
</template>

<style scoped lang="scss">
:deep(.el-text){
    line-height: 1.2;
}
</style>